import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics.pairwise import cosine_similarity
import warnings
warnings.filterwarnings('ignore')

# 1. 数据准备

user_data = {
    '人员编号': [1109152],
    '性别': [2],  # 2表示女性
    '年龄': [42],
    '民族': [1],  # 1表示汉族
    '婚姻状态': [20],  # 20表示已婚
    '教育程度': [20],  # 20表示中专
    '政治面貌': [0],  # 0表示无党派
    '宗教信仰': [1],  # 1表示无宗教
    '户口性质': [50],  # 50表示城镇户口
    '文化程度': [21],  # 21表示中专
    '人口类型': [1],  # 1表示常住人口
    '兵役状态': [0],
    '是否残疾人': [0],
    '是否青少年': [0],
    '是否老年人': [0],
    '变动类型': [0],
    '是否独居': [0],
    '居住状态': [0],
    '宏观经济': [7],
    '政策': [7],
    '劳动力市场状况': [7],
    '宜昌市居民消费价格指数': [9],
    '就业失业状态': ['失业']
}
user_df = pd.DataFrame(user_data)

# 拟招聘岗位数据（基于分析中的推荐岗位）
job_data = {
    '岗位ID': [1, 2, 3, 4],
    '岗位名称': ['生产线操作员', '零售营业员', '护理员', '客服专员'],
    '行业': ['制造业', '零售业', '医疗服务业', '服务业'],
    '最低学历': [20, 10, 20, 20],  # 20=中专，10=初中
    '年龄下限': [18, 18, 18, 18],
    '年龄上限': [50, 50, 55, 45],
    '技能要求': ['基础机械操作', '基础服务意识', '护理证书', '基础电脑操作'],
    '薪资': [4000, 3500, 5000, 3750],  # 月薪（元）
    '工作地点': ['宜昌', '宜昌', '宜昌', '宜昌'],
    '需求稳定性': [0.8, 0.7, 0.6, 0.65]  # 假设稳定性评分
}
job_df = pd.DataFrame(job_data)

# 2. 特征工程
# 选择匹配相关特征
user_features = ['性别', '年龄', '教育程度', '户口性质']
job_features = ['最低学历', '年龄下限', '年龄上限', '薪资', '需求稳定性']

# 对分类特征进行编码
le = LabelEncoder()
user_df['性别'] = le.fit_transform(user_df['性别'])
user_df['户口性质'] = le.fit_transform(user_df['户口性质'])

# 构造用户特征向量
user_vector = user_df[user_features].values

# 构造岗位特征向量（规范化处理）
job_df['年龄匹配'] = job_df.apply(lambda x: 1 if x['年龄下限'] <= user_df['年龄'][0] <= x['年龄上限'] else 0, axis=1)
job_df['学历匹配'] = job_df.apply(lambda x: 1 if x['最低学历'] <= user_df['教育程度'][0] else 0, axis=1)
job_vector = job_df[['学历匹配', '年龄匹配', '薪资', '需求稳定性']].values

# 3. 人岗匹配模型
# 使用余弦相似度计算匹配度
similarity_scores = cosine_similarity(user_vector[:, 1:3], job_vector[:, :2])  # 仅用年龄和学历匹配度
job_df['匹配度'] = similarity_scores[0]

# 使用随机森林模型预测匹配优先级（假设历史匹配数据）
# 模拟训练数据（实际需真实历史匹配数据）
train_data = pd.DataFrame({
    '性别': [2, 1, 2, 1],
    '年龄': [30, 25, 45, 35],
    '教育程度': [20, 30, 20, 10],
    '学历匹配': [1, 1, 0, 1],
    '年龄匹配': [1, 1, 1, 0],
    '薪资': [4000, 3500, 5000, 3750],
    '匹配标签': [1, 0, 1, 0]  # 1表示匹配成功
})
X_train = train_data[['性别', '年龄', '教育程度', '学历匹配', '年龄匹配', '薪资']]
y_train = train_data['匹配标签']

# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)

# 预测匹配概率
test_data = pd.DataFrame({
    '性别': [user_df['性别'][0]] * len(job_df),
    '年龄': [user_df['年龄'][0]] * len(job_df),
    '教育程度': [user_df['教育程度'][0]] * len(job_df),
    '学历匹配': job_df['学历匹配'],
    '年龄匹配': job_df['年龄匹配'],
    '薪资': job_df['薪资']
})
job_df['匹配概率'] = rf_model.predict_proba(test_data)[:, 1]

# 综合评分（匹配度+匹配概率+薪资权重）
job_df['综合评分'] = 0.4 * job_df['匹配度'] + 0.4 * job_df['匹配概率'] + 0.2 * (job_df['薪资'] / job_df['薪资'].max())

# 4. 推荐结果
# 按综合评分排序
recommendations = job_df[['岗位名称', '行业', '薪资', '技能要求', '综合评分']].sort_values(by='综合评分', ascending=False)

# 输出推荐结果
print("工作推荐结果：")
print(recommendations)

# 5. 推荐岗位分析
top_jobs = recommendations.head(3)
print("\n推荐岗位详情：")
for i, row in top_jobs.iterrows():
    print(f"岗位：{row['岗位名称']}")
    print(f"行业：{row['行业']}")
    print(f"薪资：{row['薪资']}元/月")
    print(f"技能要求：{row['技能要求']}")
    print(f"综合评分：{row['综合评分']:.4f}")
    print("-" * 50)